<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <ul class="list">
        <li>01</li>
        <li>02</li>
        <li>03</li>
        <li>04</li>
        <li>05</li>
        <li>06</li>
        <li>07</li>
        <li>08</li>
        <li>09</li>
        <li>10</li>
    </ul>
</body>
<script>
    // call apply bind   应用

    // 模拟封装slice (方便理解)
    Array.prototype._slice = function (startIndex = 0, endIndex = this.length) {
        // this -> 调用此方法的实例化对象
        var list = [];
        for (var i = startIndex; i < endIndex; i++) {
            var item = this[i];
            list.push(item);
        }
        return list;
    }
    // var arr = [1, 4, 7, 2, 5, 8, 3, 6, 9];
    // arr.slice(3, 6); // [2,5,8]
    // var result = arr.slice();
    // console.log(result);

    // 伪数组转真数组 
    // debugger;
    // var liList = document.querySelectorAll(".list li");
    // liList.slice()  伪数组正常情况下无法使用数组的拓展方法  => 借用
    // var list = Array.prototype.slice.call(liList);
    // var list = Array.prototype.slice.apply(liList);
    // console.log(list);


    // 判断数据是否是纯对象({a:1,:2} )


    var num = 1;
    var str = "hello";
    var bool = true;
    var arr = [1, 2, 3];
    var obj = { a: 1, b: 2 };
    var p = new Promise(function () { })
    var date = new Date();

    // 访问自己的构造函数的原型对象上的toString
    // console.log(num.toString());
    // console.log(str.toString());
    // console.log(bool.toString());
    // console.log(arr.toString());
    // console.log(date.toString());

    // 访问构造函数Object的原型对象上的toString
    // console.log(obj.toString());  // "[object Object]"
    // console.log(p.toString()); // "[object Promise]"


    // 统一访问Object.prototype.toString() 就可以将输出格式保持一直
    // console.log(Object.prototype.toString.call(num));
    // console.log(Object.prototype.toString.call(str));
    // console.log(Object.prototype.toString.call(bool));
    // console.log(Object.prototype.toString.call(arr));
    // console.log(Object.prototype.toString.call(date));
    // console.log(Object.prototype.toString.call(obj));
    // console.log(Object.prototype.toString.call(p));

    // console.log(Object.prototype.toString.call(arr) === '[object Array]'); //判断是否是数组
    // console.log(Object.prototype.toString.apply(obj) === '[object Object]'); // 是否是纯对象数据


    // apply()常见应用

    var list = [1, 4, 7, 2, 5, 8, 3, 6, 9];

    // var min = list[0]; //假设第一个值为最小值
    // for (var i = 0; i < list.length; i++) {
    //     var item = list[i];
    //     if (item < min) {
    //         min = item;
    //     }
    // }
    // console.log(min);

    // Math._min = function () {
    //     var min = arguments[0]; //假设第一个值为最小值
    //     for (var i = 0; i < arguments.length; i++) {
    //         var item = arguments[i];
    //         if (item < min) {
    //             min = item;
    //         }
    //     }
    //     return min;
    // }
    // var min = Math.min(1, 4, 7, 2, 5, 8, 3, 6, 9);
    // console.log(min);


    // var min = Math.min.apply(null, list); // 将参数整合到数组中在传给函数
    // var min = Math.min(...list); // ...list  => 1, 4, 7, 2, 5, 8, 3, 6, 9
    // console.log(min);











</script>

</html>